package cn.com.bluemoon.daps.standard.service;

import cn.com.bluemoon.daps.common.enums.AuditStatus;
import cn.com.bluemoon.daps.common.exception.DapException;
import cn.com.bluemoon.daps.model.dto.ModelDto;
import cn.com.bluemoon.daps.model.dto.ModelTableDto;
import cn.com.bluemoon.daps.model.entity.DapDataModel;
import cn.com.bluemoon.daps.standard.entity.*;
import cn.com.bluemoon.daps.standard.vo.SysAuditReportFieldSearchVo;
import cn.com.bluemoon.daps.standard.vo.SysAuditReportSearchVo;
import cn.com.bluemoon.daps.standard.vo.SystemAuditSearchVo;
import cn.com.bluemoon.daps.system.dto.SystemInfoDto;
import cn.com.bluemoon.daps.system.entity.DapSystemInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import java.util.List;

/**
 * @author Jarod.Kong
 * @date 2020/9/2 14:40
 */
@Validated
public interface DapSystemAuditService {
    /**
     * 分页查询 系统稽核数据
     *
     * @param auditSearchVo
     * @return
     */
    IPage<SystemInfoDto> findSysAuditListPage(SystemAuditSearchVo auditSearchVo);

    /**
     * @param sysAuditId {@link DapSystemInfo#getAuditResultId()} {@link DapAuditSystemResult#getAuditResultId()}
     * @return
     */
    List<DapAuditSystemResult> findAuditSystemResultList(@NotBlank(message = "系统稽核id不可为空") String sysAuditId);

    /**
     * 获取模型列表数据
     *
     * @param SysAuditResultId {@link DapAuditSystemResult#getId()} ()}
     * @return
     */
    List<DapDataModel> findModelInfosBySystemId(@NotBlank(message = "系统id不为空") String systemId);


    /**
     * 获取中文检查（表级）报告
     *
     * @param searchV
     * @return
     */
    IPage<DapAuditChinResult> findAuditSystemAuditChinResults(SysAuditReportSearchVo<DapAuditChinResult> searchV);

    /**
     * 获取中文检查（字段级）报告
     *
     * @param searchVo 字段查询条件
     * @return
     */
    IPage<DapAuditFieldChinResult> findAuditFieldChinResults(SysAuditReportFieldSearchVo<DapAuditFieldChinResult> searchVo);

    /**
     * @param sysAuditId
     * @param modelId    为空获取所有报告
     * @return
     */
    Workbook exportAuditChinResults(SysAuditReportSearchVo<DapAuditChinResult> searchV, String key);

    /**
     * @param sysAuditId
     * @param modelId    为空获取所有报告
     * @return
     */
    Workbook exportAuditStdResults(SysAuditReportSearchVo<DapAuditStandardResult> searchV, String key);

    /**
     * 发起稽核
     *
     * @param sysId 系统id
     */
    void startAuditBySysId(String sysId) throws DapException;

    /**
     * 生成报告
     *
     * @param sysInfo 系统id不可为空
     */
    void generateReportBySystemId(DapSystemInfo sysInfo) throws DapException;

    /**
     * 增加修改稽核状态接口
     *
     * @param systemId
     * @param auditStatus
     */
    void setSysAuditStatus(String systemId, AuditStatus auditStatus, boolean auditTime);

    void setSysAuditStatus(String systemId, String auditResultId, AuditStatus auditStatus, boolean updateAuditTime);

    /**
     * 根据模型获取表和字段信息
     *
     * @param modelId
     * @param sqlSelect
     * @return
     */
    List<ModelTableDto> findTableInfosByModelId(String modelId, boolean sqlSelect);

    /**
     * 根据系统获取模型信息只有模型信息
     *
     * @param systemId 系统
     * @return 根据系统获取模型信息
     */
    List<DapDataModel> findModelsBySystemId(String systemId);

    /**
     * 根据系统获取模型信息(有表信息+字段信息）
     *
     * @param systemId 系统
     * @return 根据系统获取模型信息
     */
    List<ModelDto> findModelAndTableAndFieldsBySystemId(String systemId);

    /**
     * 获取中文检查（表级）报告
     *
     * @param searchVo
     * @return
     */
    IPage<DapAuditStandardResult> findAuditSystemAuditStdResults(SysAuditReportSearchVo<DapAuditStandardResult> searchVo);

    /**
     * 获取中文检查（字段级）报告
     *
     * @param searchVo
     * @return
     */
    IPage<DapAuditFieldStandardResult> findAuditFieldStdResults(SysAuditReportFieldSearchVo<DapAuditFieldStandardResult> searchVo);

}
